﻿/*
7-51 两个有序链表序列的合并 (20 分)
已知两个非降序链表序列S1与S2，设计函数构造出S1与S2合并后的新的非降序链表S3。

输入格式:
输入分两行，分别在每行给出由若干个正整数构成的非降序序列，用−1表示序列的结尾（−1不属于这个序列）。数字用空格间隔。

输出格式:
在一行中输出合并后新的非降序链表，数字间用空格分开，结尾不能有多余空格；若新链表为空，输出NULL。

输入样例:
1 3 5 -1
2 4 6 8 10 -1
输出样例:
1 2 3 4 5 6 8 10
*/

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#include "array_int.h"

// 在大规模数据测试中, MAXSIZE小了, 出现了错误
#define MAXSIZE 1500000
// 在使用链表的操作中, 因为使用函数封装了功能, 导致调用超时

Array read_list() {
	Array a = array_create(MAXSIZE);
	int data;
	while (scanf("%d", &data) == 1) {
		if (data == -1)
			break;
		array_push(a, data);
	}
	array_set(a, a->last + 1, ERROR);
	return a;
}

Array list_merge(Array a, Array b) {
	Array c = array_create(MAXSIZE+ MAXSIZE);
	ArrayElementType *da = a->data;
	ArrayElementType* db = b->data;
	while (*da>0 && *db>0) {
		if (*da <= *db) 
			array_push(c, *da++);
		else 
			array_push(c, *db++);
	}
	while (*da > 0)
		array_push(c, *da++);
	while (*db > 0)
		array_push(c, *db++);

	array_set(c, c->last + 1, ERROR);
	return c;
}

void resolve() {
	Array a = read_list();
	Array b = read_list();
	Array c = list_merge(a, b);

	print_array(a);
	print_array(b);
	print_array(c);

	array_free(a);
	array_free(b);
	array_free(c);
}

int main() {
	freopen("D:/Develop/GitRepos/MOOC/浙江大学/数据结构/201906/PTA_DS_CN/7_51.txt", "r", stdin);
	resolve();
	return 0;
}